from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, JSON, Text
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from datetime import datetime
from database import Base


class FlightLog(Base):
    """
    飞行日志模型
    记录无人机自动生成的飞行数据
    """
    __tablename__ = "flight_logs"

    id = Column(Integer, primary_key=True, index=True)
    
    # 关联信息
    drone_id = Column(Integer, ForeignKey('drones.id'), nullable=False, index=True)
    task_id = Column(Integer, ForeignKey('tasks.id'), nullable=True, index=True)
    
    # 时间信息
    record_time = Column(DateTime(timezone=True), server_default=func.now(), index=True)  # 记录时间
    
    # 位置信息
    latitude = Column(Float, nullable=False)  # 纬度
    longitude = Column(Float, nullable=False)  # 经度
    altitude = Column(Float, nullable=False)  # 高度（米）
    
    # 飞行状态
    speed = Column(Float, nullable=False)  # 速度（米/秒）
    heading = Column(Float, nullable=False)  # 航向角（度）
    roll = Column(Float)  # 横滚角（度）
    pitch = Column(Float)  # 俯仰角（度）
    yaw = Column(Float)  # 偏航角（度）
    
    # 电机信息
    motor_speed_1 = Column(Float)  # 电机1转速
    motor_speed_2 = Column(Float)  # 电机2转速
    motor_speed_3 = Column(Float)  # 电机3转速
    motor_speed_4 = Column(Float)  # 电机4转速
    
    # 电池信息
    battery_voltage = Column(Float, nullable=False)  # 电池电压（V）
    battery_current = Column(Float)  # 电池电流（A）
    battery_percentage = Column(Integer)  # 电池电量百分比
    
    # 环境信息
    temperature = Column(Float)  # 温度（摄氏度）
    humidity = Column(Float)  # 湿度（百分比）
    wind_speed = Column(Float)  # 风速（米/秒）
    wind_direction = Column(Float)  # 风向（度）
    
    # 系统状态
    cpu_temperature = Column(Float)  # CPU温度
    gpu_temperature = Column(Float)  # GPU温度
    ram_usage = Column(Float)  # 内存使用率
    
    # 任务执行状态
    task_progress = Column(Integer)  # 任务进度百分比
    current_waypoint_index = Column(Integer)  # 当前航点索引
    
    # 其他信息
    flight_mode = Column(String(50))  # 飞行模式
    gps_satellites = Column(Integer)  # GPS卫星数量
    gps_accuracy = Column(Float)  # GPS精度
    error_code = Column(String(50))  # 错误代码
    error_message = Column(Text)  # 错误信息
    
    # 扩展数据（存储其他可能的传感器数据）
    extended_data = Column(JSON, nullable=True)  # 存储其他传感器数据
    
    created_at = Column(DateTime, default=datetime.now)
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
    
    # 关联关系
    drone = relationship("Drone", backref="flight_logs")
    task = relationship("Task", backref="flight_logs")